﻿using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;

namespace XamlSaveRestoreExample
{
    public partial class MainWindow : Window
    {
        private const string SaveFilePath = "controls.xaml";

        public MainWindow()
        {
            InitializeComponent();

            // 如果有保存的配置文件，则加载
            if (File.Exists(SaveFilePath))
            {
                // 清空 MyGrid 中的所有子元素
                MyGrid.Children.Clear();

                try
                {
                    // 加载新的 XAML 元素并添加到 MyGrid
                    var loadedElement = LoadFromXaml(SaveFilePath);

                    // 清除加载元素中的 Name 属性，避免命名冲突
                    RemoveNames(loadedElement);

                    MyGrid.Children.Add(loadedElement);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"加载 XAML 时发生错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        // 保存控件到 XAML 文件
        private void SaveToXaml(UIElement element, string filePath)
        {
            try
            {
                var xaml = XamlWriter.Save(element);
                File.WriteAllText(filePath, xaml);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存 XAML 时发生错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        // 从 XAML 文件加载控件
        private UIElement LoadFromXaml(string filePath)
        {
            var xaml = File.ReadAllText(filePath);
            return (UIElement)XamlReader.Parse(xaml);
        }

        // 遍历控件并清除 Name 属性
        private void RemoveNames(UIElement element)
        {
            if (element is FrameworkElement frameworkElement)
            {
                frameworkElement.Name = null; // 清除 Name 属性

                // 递归清除子元素的 Name 属性
                if (element is Panel panel)
                {
                    foreach (UIElement child in panel.Children)
                    {
                        RemoveNames(child);
                    }
                }
            }
        }

        // 窗口关闭时保存控件状态
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            base.OnClosing(e);

            try
            {
                SaveToXaml(MyGrid, SaveFilePath);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存 XAML 时发生错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
